package com.bcu.alumnus.service;

import cn.hutool.core.util.StrUtil;
import com.bcu.alumnus.config.GlobalConfig;
import com.bcu.alumnus.entity.Activity;
import com.bcu.alumnus.entity.Message;
import com.bcu.alumnus.repo.ActivityRepository;
import com.bcu.alumnus.utils.LocationUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import javax.persistence.criteria.Predicate;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


@Service
@Validated
@Transactional
public class ActivityService {

    private Logger logger= LoggerFactory.getLogger(getClass());

    @Resource
    private ActivityRepository activityRepository;

    @Resource
    private GlobalConfig config;



    /**
     *
     *1. 添加校园活动，初始状态为0，待审核,活动创建时间为当前时间 @UseToken(level=1)
     *2. 通过学部编号查找已审核的校园活动
     *3. 通过创建人编号查找已审核的校园活动
     *4. 查找校级活动
     *5. 通过创建人编号和活动状态查找活动
     *6. 通过学部编号查找所有活动
     *7. 查找所有活动那个
     *8. 通过活动状态查找所有的活动
     *9. 通过活动类型查找所有的活动
     *10. 通过活动编号查找活动
     *11. 修改活动状态
     */


    /**
     * @Author: GuoZiZhou
     * @Date: 15:18 2020/4/8
     * @Description: 添加校园活动，初始状态为0，待审核,活动创建时间为当前时间 @UseToken(level=1)
     */
    /**
     * @Author: Wls
     * @Date: 23:18 2020/5/8
     * @Description: 【勿动】 前端已调试通过，请勿再次修改
     */
    public Message<Activity> addActivity(Activity activity){

        logger.info("添加校园活动. 编号：{}，标题：{}",activity.getActId(),activity.getActTitle());
        logger.info(activity.toString());

        activity.setActCreateTime(new Date());
        activity.setActStatus("0");

        /*         * 将处于临时文件夹的文件转移到业务文件夹
         * */
        File titleImg = new File(config.globalFilePath+"/temp/"+activity.getActTitleImg().split(";")[0]);


        if (titleImg.exists()) {
            boolean b = titleImg.renameTo(new File(config.globalFilePath+"/activity/"+activity.getActTitleImg().split(";")[0]));
            logger.info("将标题图片转移至业务文件夹，标题：{}结果：{}",activity.getActTitleImg(),b);
            activity.setActTitleImg("/resource/activity/"+activity.getActTitleImg().split(";")[0]);
        }else{
            logger.warn("标题图片不存在！标题：{}，目标位置：{}",activity.getActTitleImg(),titleImg.getAbsolutePath());
        }

        String[] contentFiles=activity.getActContentImg().split(";");
        activity.setActContentImg("");
        for (String contentFile : contentFiles) {
            File tmpImg = new File(config.globalFilePath+"/temp/"+contentFile);
            if (tmpImg.exists()) {
                tmpImg.renameTo(new File(config.globalFilePath+"/activity/"+contentFile));
                activity.setActContentImg(activity.getActContentImg()+ "/resource/activity/"+contentFile+";");
            }
        }


//
        Activity rs = activityRepository.save(activity);
        logger.info("校园活动已添加，编号：{}",rs.getActId());
        return Message.success(null).add(rs);
    }


    /**
     * @Author: GuoZiZhou
     * @Date: 16:18 2020/4/8
     * @Description: 通过学部编号查找已审核的校园活动
     */
    public Message<List<Activity>> getActivityByActPartId(String ActPartId){
        logger.info("通过学部编号查找已审核的校园活动，学部编号{}",ActPartId);
        return Message.success(null).add(activityRepository.getActivityByActPartIdAndActStatusNot(ActPartId,"0"));
    }

    /**
     * @Author: GuoZiZhou
     * @Date: 16:52 2020/4/8
     * @Description: 通过创建人编号查找已审核的校园活动
     */
    public Message<List<Activity>> getActivityByActUserId(String ActUserId){
        logger.info("通过创建人编号查找已审核的校园活动，创建人编号{}",ActUserId);
        return Message.success(null).add(activityRepository.getActivityByActUserId(ActUserId));
    }

    /**
     * @Author: GuoZiZhou
     * @Date: 18:11 2020/4/8
     * @Description: .通过学部编号查找已审核的校园活动 以及 活动类型为校级的已审核校园活动
     */
    public Message<List<Activity>> getActivityByActPartIdAndActType(String ActPartId){
        logger.info("活动类型为校级的已审核校园活动");
        return Message.success(null).add(activityRepository.getActivityForMiniProgram(ActPartId));
    }

    /**
     * @Author: GuoZiZhou
     * @Date: 21:17 2020/4/8
     * @Description: 通过创建人编号和活动状态查找活动
     */
    public Message<List<Activity>> getActivityByActUserIdAndActStatus(String ActUserId,String ActStatus){
        logger.info("查找校园活动，通过创建用户编号{}，和活动状态{}",ActUserId,ActStatus);
        return Message.success(null).add(activityRepository.getActivityByActUserIdAndActStatus(ActUserId,ActStatus));
    }

    /**
     * @Author: GuoZiZhou
     * @Date: 21:36 2020/4/8
     * @Description: 通过学部编号查找所有活动
     */
    public Message<List<Activity>> getAllActivityByActPartId(String ActPartId){
        logger.info("查找所有校园活动，通过学部编号",ActPartId);
        return Message.success(null).add(activityRepository.getActivityByActPartId(ActPartId));
    }

    /**
     * @Author: GuoZiZhou
     * @Date: 13:40 2020/4/9
     * @Description: 查找所有活动
     */
    public Message<List<Activity>> getAllActivity(){
        logger.info("查找所有校园活动");
        return Message.success(null).add(activityRepository.findAll());
    }

    /**
     * @Author: GuoZiZhou
     * @Date: 13:44 2020/4/9
     * @Description: 通过活动状态查找所有活动
     */
    public Message<List<Activity>> getActivityByActStatus(String ActStatus){
        logger.info("查找所有校园活动，活动状态{}",ActStatus);
        return Message.success(null).add(activityRepository.getActivityByActStatus(ActStatus));
    }

    /**
     * @Author: GuoZiZhou
     * @Date: 13:59 2020/4/9
     * @Description: 通过活动状态查找所有活动
     */
    public Message<List<Activity>> getActivityByActType(String ActType){
        logger.info("通过活动状态查找所有活动,活动类型{}",ActType);
        return Message.success(null).add(activityRepository.getActivityByActType(ActType));
    }

    /**
     * @Author: GuoZiZhou
     * @Date: 21:51 2020/4/12
     * @Description: 通过活动编号查找活动
     */
    public Message<Activity> getActivityByActId(int ActId){
        logger.info("通过活动编号查找活动,活动id{}",ActId);
        return Message.success(null).add(activityRepository.getActivityByActId(ActId));
    }

    /**
     * @Author: GuoZiZhou
     * @Date: 22:07 2020/4/12
     * @Description: 修改活动状态
     */
    public Message updateActivityByActId(String ActStatus, int ActId){
        logger.info("审核活动,活动id{}",ActId);
        return Message.success(null).add(activityRepository.updataActStatusByActId(ActStatus,ActId));
    }

    /**
    * @Author: Wls
    * @Date: 23:23 2020/5/9
    * @Description: 根据校园活动状态和学部编号查询活动
    */
    public Message<List<Activity>> getActivityByActStatusAndActPartId(String actStatus,String actPartId){
        logger.info("根据校园活动状态和学部编号查询活动,actStatus{{}},actPartId{{}}",actStatus,actPartId);
        return Message.success(null).add(activityRepository.getActivityByActStatusAndActPartId(actStatus, actPartId));

    }

    /**
     * @Author: GuoZiZhou
     * @Date: 22:07 2020/4/12
     * @Description: 根据活动标题查找活动
     */
    public Message<List<Activity>> getActivityByActTitly(String actTitly){
        return Message.success(null).add(activityRepository.getActivityByActTitle(actTitly));
    }

    /**
     * @Author: Shj
     * @Date: 21:31 2020/5/27
     * @Description: 条件查询
     */
    public Message<List<Activity>> getActivityConditionSearch(String actTitle,String actPrincipalName,String actAddress)
    {
        Specification<Activity> query= (Specification<Activity>) (root, criteriaQuery, criteriaBuilder) -> {
            List<Predicate> predicates=new ArrayList<>();
            /*if (!StrUtil.hasBlank(actId)) {
                logger.info("actId is not blank ,is {}",actId);
                predicates.add(criteriaBuilder.like(root.get("actId"),"%"+actId+"%"));
            }*/

            if (!StrUtil.hasBlank(actTitle)) {
                logger.info("actTitle is not blank ,is {}",actTitle);
                predicates.add(criteriaBuilder.like(root.get("actTitle"),"%"+actTitle+"%"));
            }

            if (!StrUtil.hasBlank(actPrincipalName)) {
                logger.info("actPrincipalName is not blank ,is {}",actPrincipalName);
                predicates.add(criteriaBuilder.like(root.get("actPrincipalName"),"%"+actPrincipalName+"%"));
            }

            if (!StrUtil.hasBlank(actAddress)) {
                logger.info("actAddress is not blank ,is {}",actAddress);
                predicates.add(criteriaBuilder.like(root.get("actAddress"),"%"+actAddress+"%"));
            }
            return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
        };
        return Message.success(null).add(activityRepository.findAll(query));

    }

    public Message deleteByActivityId(int ActivityId){
        return activityRepository.deleteByActId(ActivityId)>0?Message.success(null):Message.fail(null);
    }
}
